package com.atguigu.mobileplayer4.pager;

import android.Manifest;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.text.format.Formatter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.atguigu.mobileplayer4.R;
import com.atguigu.mobileplayer4.SystemVideoPlayer;
import com.atguigu.mobileplayer4.base.BasePager;
import com.atguigu.mobileplayer4.domain.MediaItem;
import com.atguigu.mobileplayer4.uitls.Utils;

import java.util.ArrayList;

/**
 * 作者：杨光福 on 2016/5/21 10:45
 * 微信：yangguangfu520
 * QQ号：541433511
 * 作用：本地视频页面
 *
 * initView 方法执行
 * VideoPager(Context context) 执行
 * initData 执行
 * handleMessage方法执行
 */
public class VideoPager extends BasePager {

    private ListView lv_video_pager;
    private TextView tv_nomedia;
    private ProgressBar pb_loading;

    private ArrayList<MediaItem > mediaItems;
    private Utils utils;



    public VideoPager(Context context) {
        super(context);
        System.out.println("VideoPager 构造方法执行。。。");
        utils = new Utils();
    }


    /***
     * 这个方法是BasePager父类的abstract View initView抽象方法
     * 子类需要重写
     * @return
     */
    @Override
    public View initView() {
        System.out.println("initView方法执行。。");
        /***
         * 把布局文件转换成对应的 View 对象
         *context：这是一个必需的上下文对象，通常可以使用 Activity 或者 Fragment 的上下文。
         * resource：同样是必需参数，它是布局文件的资源 ID，比如 R.layout.activity_main。
         * root：可选参数，它是父 ViewGroup，用于为生成的 View 提供布局参数。
         * attachToRoot：可选的布尔值参数，若设为 true，则会把生成的 View 添加到 root 中；若设为 false，则只生成 View，但不添加到 root。
         */
        View view = View.inflate(context, R.layout.video_pager,null);
         //视频列表数据
        lv_video_pager = (ListView) view.findViewById(R.id.lv_video_pager);
        //文本内容
        tv_nomedia = (TextView) view.findViewById(R.id.tv_nomedia);
        //ProgressBar
        pb_loading = (ProgressBar) view.findViewById(R.id.pb_loading);
        //设置点击事件   setOnItemClickListener() 用于为列表控件（如 ListView、GridView）设置点击事件监听器
        lv_video_pager.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            /****
             * @param parent  发生点击的 AdapterView（如 ListView）
             * @param view  被点击的列表项视图
             * @param position  点击位置（从 0 开始）
             * @param id  列表项的 ID（由适配器的 getItemId() 返回）
             */
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                MediaItem mediaItem = mediaItems.get(position);

//                Intent intent = new Intent();
//                intent.setDataAndType(Uri.parse(mediaItem.getData()),"video/*");
//                context.startActivity(intent);


                Intent intent = new Intent(context, SystemVideoPlayer.class);
                //用于创建一个明确指定数据类型的意图（Intent），通常用于调用系统播放器播放视频文件。
                //Uri.parse(mediaItem.getData())：视频文件的 URI，可以是本地文件路径（如 file:///sdcard/video.mp4）或
                // content URI（如 content://media/external/video/media/123）
                //"video/*"：MIME 类型，表示所有视频格式。也可指定具体格式，如 "video/mp4"、"video/3gpp" 等。
                intent.setDataAndType(Uri.parse(mediaItem.getData()),"video/*");
                context.startActivity(intent);
            }
        });
        return view;
    }


    /***
     *   当孩子需要初始化数据的时候， 重写该方法，用于请求数据，或者显示数据
     */
    @Override
    public void initData() {
        System.out.println("initData方法执行。。。");
        super.initData();
        getData();
    }

    private Handler handler = new Handler(){

        //handleMessage  这个方法需要重写
        @Override
        public void handleMessage(Message msg) {
            System.out.println("handleMessage方法执行 。。");
            super.handleMessage(msg);
            //主线程
            if(mediaItems != null && mediaItems.size() >0){    //有数据展示数据列表 没有数据直接提示文字展示
                tv_nomedia.setVisibility(View.GONE);
                pb_loading.setVisibility(View.GONE);

                //设置适配器   展示视频列表
                lv_video_pager.setAdapter(new VideoPagerAdapter());
            }else{
                tv_nomedia.setVisibility(View.VISIBLE);
                pb_loading.setVisibility(View.GONE);
            }

        }
    };


    /****
     * BaseAdapter 是一个抽象类，用于为 ListView、GridView 等列表控件提供数据和视图。它是所有适配器的基类，灵活性高，适用于复杂列表项的场景。
     *
     */
    class VideoPagerAdapter extends BaseAdapter{


        /***
         * 返回数据源的总条目数。
         * @return
         */
        @Override
        public int getCount() {
            return mediaItems.size();
        }


        /***
         * 返回指定位置（position）的数据项。
         * @param position
         * @return
         */
        @Override
        public Object getItem(int position) {
            return null;
        }

        /***
         * 返回指定位置的数据项 ID（通常直接返回 position）。
         * @param position
         * @return
         */
        @Override
        public long getItemId(int position) {
            return 0;
        }


        /****
         * 创建或复用列表项视图，并绑定数据。
         * @param position  当前列表项的位置
         * @param convertView 可复用的旧视图（系统缓存的回收视图）。
         * @param parent  父容器（如 ListView）
         * @return
         */
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //ViewHolder 是一种用于优化列表性能的设计模式，主要用于减少 ListView 或 RecyclerView 中重复调用 findViewById() 的开销
            //ViewHolder 是 Android 列表性能优化的核心技术，通过缓存控件引用减少 findViewById() 的调用，显著提升列表滚动流畅度。
            ViewHolder viewHolder;
            if(convertView ==null){
                //将 XML 布局文件转换为对应的 View 对象
                convertView = View.inflate(context,R.layout.item_video_pager,null);
                viewHolder = new ViewHolder();
                viewHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
                viewHolder.tv_duration = (TextView) convertView.findViewById(R.id.tv_duration);
                viewHolder.tv_size = (TextView) convertView.findViewById(R.id.tv_size);
                //convertView.setTag() 是优化列表性能的关键方法，主要用于缓存 ViewHolder 对象，避免重复调用 findViewById()
                convertView.setTag(viewHolder);
            }else{
                //convertView.getTag() 是与 convertView.setTag() 配套使用的方法，主要用于从复用的视图中获取之前存储的 ViewHolder 对象
                viewHolder = (ViewHolder) convertView.getTag();
            }

            MediaItem mediaItem = mediaItems.get(position);
            viewHolder.tv_name.setText(mediaItem.getName());
            viewHolder.tv_size.setText(Formatter.formatFileSize(context, mediaItem.getSize()));
            viewHolder.tv_duration.setText(utils.stringForTime((int) mediaItem.getDuration()));
            return convertView;
        }
    }

    static class ViewHolder{
        TextView tv_name;
        TextView tv_duration;
        TextView tv_size;
    }

    /****
     * 用线程的方法 得到数据
     */
    private void getData() {


        new Thread(){
            @Override
            public void run() {
                super.run();
                mediaItems = new ArrayList<MediaItem>();
                //ContentResolver：用于与设备上的内容提供者（ContentProvider）进行交互的核心类，可访问和操作各种内容（如联系人、媒体文件等）。
                ContentResolver contentResolver = context.getContentResolver();
              //  MediaStore：Android 提供的内容提供者，专门用于访问设备上的媒体文件（图片、视频、音频等）。
               // EXTERNAL_CONTENT_URI：指向外部存储（如 SD 卡）中媒体文件的 URI。
                Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;

                // 根据 Android 版本选择查询字段
                String[] objects;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    // Android 10+ 不推荐使用 DATA 字段
                    objects = new String[]{
                            MediaStore.Video.Media._ID,
                            MediaStore.Video.Media.DISPLAY_NAME,
                            MediaStore.Video.Media.DURATION,
                            MediaStore.Video.Media.SIZE
                    };
                } else {
                    // Android 9 及以下可获取真实路径
                    objects = new String[]{
                            MediaStore.Video.Media._ID,
                            MediaStore.Video.Media.DISPLAY_NAME,
                            MediaStore.Video.Media.DURATION,
                            MediaStore.Video.Media.SIZE,
                            MediaStore.Video.Media.DATA
                    };
                }
/*
                String[] objects = {
                        MediaStore.Video.Media.DISPLAY_NAME,//在Sdcard显示的名称
                        MediaStore.Video.Media.DURATION,//视频的长度
                        MediaStore.Video.Media.SIZE,//视频文件大小
                      //  MediaStore.Video.Media.DATA//视频的绝对地址
                };*/

                /***
                 *      从内容提供者那里获取数据
                 *       uri,            // 内容提供者的 URI
                 *     projection,     // 要查询的列，若为 null 则返回所有列
                 *     selection,      // 筛选条件，相当于 SQL 中的 WHERE 子句
                 *     selectionArgs,  // 筛选条件的参数
                 *     sortOrder       // 排序方式
                 */
                Cursor cursor =  contentResolver.query(uri, objects, null, null, null);
                if(cursor != null){
                    // 处理查询结果   拼接成MediaItem对象
                    while (cursor.moveToNext()){

                        MediaItem mediaItem = new MediaItem();
                        String name = cursor.getString(0);
                        mediaItem.setName(name);

                        long duration = cursor.getLong(1);
                        mediaItem.setDuration(duration);

                        long size = cursor.getLong(2);
                        mediaItem.setSize(size);

                        String data = cursor.getString(3);
                        mediaItem.setData(data);


                        //把视频添加到列表中
                        mediaItems.add(mediaItem);
                    }


                    cursor.close();;
                }

                //Handler.sendEmptyMessage() 是一种用于在不同线程间传递消息的机制
                handler.sendEmptyMessage(0);

            }
        }.start();
    }
}
